Rust 的閉包是一種匿名函式,可以從其函式的作用域中捕獲數值,而且閉包是為了快速執行而設計的,也因為如此它們的性能比一般函式還要好。
閉包有以下幾個特性:
閉包的建立方式:
| 來分隔參數,| 後面是函式的主體{} 來包裹函式的主體例如:
let plus_one = |x: i32| -> i32 { x + 1 };
plus_one(1); // 2
建立閉包的時候,有些特殊的地方可以注意:
|| 來建立一個空閉包return 來回傳值,直接使用 -> 來指定回傳值的型別上面的範例中,我們建立了一個閉包,並且將它存到變數 plus_one 中,然後呼叫它。
閉包可以像函式一樣使用,例如:
fn main() {
    let plus_one = |x: i32| -> i32 { x + 1 };
    let a = plus_one(1);
    println!("a is {}", a); // a is 2
}
閉包可以像函式一樣傳遞給其他函式,例如:
fn main() {
    let plus_one = |x: i32| -> i32 { x + 1 };
    let a = do_twice(plus_one, 1);
    println!("a is {}", a); // a is 3
}
fn do_twice<F>(f: F, arg: i32) -> i32
where
    F: Fn(i32) -> i32,
{
    f(arg) + f(arg)
}
上面的範例中,我們定義了一個函式 do_twice,它接受一個函式 f 和一個參數 arg,然後呼叫 f 兩次,並且將結果相加。
在呼叫 do_twice 的時候,我們傳遞了一個閉包 plus_one,並且傳遞了一個參數 1。
閉包可以從定義的作用域中捕獲變數,例如:
fn main() {
    let num = 5;
    let plus_num = |x: i32| -> i32 { x + num };
    let a = plus_num(1);
    println!("a is {}", a); // a is 6
}
上面的範例中,我們定義了一個變數 num,並且將它傳遞給一個閉包 plus_num,然後呼叫 plus_num。
在呼叫 plus_num 的時候,閉包會從定義的作用域中捕獲變數 num,並且將它加到 x 上。
move 關鍵字來捕獲變數?使用 move 關鍵字可以用來捕獲變數,並且將它們移動到閉包中,例如:
fn main() {
    let num = 5;
    let plus_num = move |x: i32| -> i32 { x + num };
    let a = plus_num(1);
    println!("a is {}", a); // a is 6
}
上面的範例中,我們定義了一個變數 num,並且將它傳遞給一個閉包 plus_num,然後呼叫 plus_num。
在呼叫 plus_num 的時候,與上面其他例子不同的是,我們使用 move 關鍵字來捕獲變數,並且將它加到 x 上。
以上就是閉包的基本用法,如果有任何問題,歡迎在下方留言討論。
本文同步發表於我的技術部落格,歡迎大家有空去參觀。